Экспериментальное ПО: Vivado 2021, Vitis 2021
Цель эксперимента: Программирование Flash с интерфейсом QSPI через последовательный порт
В этом эксперименте создается новый проект в Vitis двумя методами: Create Application Project и Create Platform Project
Откройте Vivado, после входа в интерфейс Vivado нажмите "Create Project" в разделе "Quick Start". Затем во всплывшем интерфейсе мастера создания проекта Vivado нажмите "Next".
В интерфейсе именования проекта. Установите имя проекта "Mind-Z7020_Vitis_Example" и выберите путь к проекту по необходимости. На этот раз мы размещаем проект в папке D://. Обратите внимание, что имя и путь проекта могут состоять только из английских букв, цифр и подчеркиваний и не могут содержать китайские иероглифы, пробелы или специальные символы. Установите флажок "Create project subdirectory", затем нажмите "Next":
Установите тип проекта в этом интерфейсе. Здесь мы выбираем "RTL Project". Этот эксперимент не требует добавления исходных файлов и файлов ограничений, поэтому установите флажок "Do not specify sources at this time". Установка этого флажка пропустит последующие шаги добавления исходных файлов и файлов ограничений. Нажмите "Next", чтобы перейти непосредственно к интерфейсу выбора устройства.
Интерфейс выбора устройства. Выберите "Zynq-7000" в столбце Family, выберите "-2" в столбце Speed. Важно отметить, что в столбце Package необходимо выбрать "clg400". Затем на основе модели чипа ZYNQ, используемой на основной плате, выберите "xc7z020clg400-2" из списка устройств ниже, как показано на рисунке.
Отображение сводной информации о новом проекте, как показано на рисунке. Проверьте ранее установленное имя проекта, выбранную модель устройства и другую информацию в этом интерфейсе. Если обнаружены какие-либо неверные настройки проекта, вы можете вернуться к предыдущим шагам для изменения с помощью кнопки Back. После проверки и подтверждения того, что все правильно, нажмите "Finish", чтобы завершить создание проекта.
Интерфейс Vivado после завершения создания проекта показан на рисунке.
В левой панели навигации (Flow Navigator) нажмите Create Block Design в разделе IP Integrator. Затем во всплывшем диалоговом окне укажите имя создаваемого Block Design и введите "system" в поле Design name.
После нажатия "OK" войдите в графический интерфейс проектирования. Нажмите "+" в окне Diagram, чтобы добавить IP-ядро (Intellectual Property (IP) core, которые представляют собой предварительно разработанные, повторно используемые модули аппаратных функций, предоставляемые Xilinx (AMD) или третьими сторонами. Эти IP-ядра инкапсулируют определенные аппаратные функции (такие как процессоры, контроллеры интерфейсов, ускорители алгоритмов и т.д.)). Вы также можете использовать сочетание клавиш Ctrl + I или щелкнуть правой кнопкой мыши на пустой области в рабочем пространстве Diagram, а затем выбрать "ADD IP".
После появления каталога IP введите "zynq" в строке поиска, дважды щелкните "ZYNQ7 Processing System", чтобы добавить этот IP в проект.
После завершения добавления модуль ZYNQ7 Processing System появляется в Diagram, как показано ниже:
Далее настройте ZYNQ. Дважды щелкните добавленный модуль ZYNQ7 Processing System, чтобы войти в интерфейс конфигурации системы обработки ZYNQ7. Его левая сторона — это навигация по страницам, а правая — панель информации о конфигурации. Как показано:
Zynq Block Design: Показывает различные настраиваемые блоки системы обработки Zynq (PS), где серые части не изменяемы, а выделенные зеленым части настраиваемы. Существует два способа входа на страницу конфигурации: напрямую щелкнуть на различные настраиваемые блоки (выделенные зеленым части), чтобы войти на их страницу конфигурации для настройки, или выбрать навигацию по страницам слева, чтобы войти на соответствующую страницу для настройки. PS-PL Configuration: Настройка интерфейса PS-PL, включая интерфейсы шин AXI GP, HP и другие. Peripheral I/O Pins: Выбор MIO/EMIO для различных периферийных устройств ввода-вывода. MIO Configuration: Конкретная настройка MIO/EMIO для различных периферийных устройств ввода-вывода. Clock Configuration: Используется для настройки входной тактовой частоты PS, тактовой частоты периферийных устройств, а также тактовых частот DDR и CPU и т.д. DDR Configuration: Используется для установки информации конфигурации контроллера DDR. SMC Timing Calculation: Используется для выполнения расчетов временных характеристик SMC. Interrupts: Используется для настройки портов прерываний PS-PL.
Настройте последовательный порт, используемый для вывода информации. Здесь выберите UART PS. Нажмите на страницу Peripheral I/O Pins, и появится следующий интерфейс конфигурации выводов ввода-вывода. На рисунке установите напряжение Bank в соответствии со схемой (Bank0 — 3.3В, Bank1 — 1.8В).
Соединение между PS и внешними устройствами в основном достигается через Multiplexed Input/Output (MIO). 54 вывода MIO PS могут использоваться для подключения к различным периферийным интерфейсам. Например, MIO14 и MIO15 на рисунке могут быть настроены как интерфейсные выводы для UART0 или как интерфейсные выводы для I2C0 или CAN0. Конкретная конфигурация для какой периферийной функции зависит от платы разработки.
MIO14 и MIO15 в BANK500 используются как выводы для последовательной связи UART и в конечном итоге подключены к чипу USB-to-serial CH340X на базовой плате. Поэтому для реализации функциональности последовательной связи нам необходимо настроить MIO14 и MIO15 как интерфейсные выводы для модуля UART0 в PS.
Нажмите на страницу MIO Configuration слева, разверните I/O Peripherals > UART0 справа, и вы увидите конкретную информацию о конфигурации выводов: MIO14 как вывод RX, MIO15 как вывод TX.
Настройте скорость передачи для последовательной связи UART0. В каталоге General вы можете увидеть, что скорость передачи по умолчанию для UART0 составляет 115200. Другие скорости передачи можно выбрать с помощью кнопки выпадающего списка.
Настройте QSPI Flash: Это можно настроить либо в Peripheral I/O Pins, либо в MIO Configuration. Если на странице MIO Configuration, вы можете выбрать Memory Interfaces, а затем установить флажок Quad SPI Flash, в этот момент будет автоматически выбран Single SS 4-bit IO.
Настройте контроллер DDR3 PS. Нажмите на страницу DDR Configuration слева и в DDR Controller Configuration справа выберите устройство DDR в столбце "Memory Part", выберите MT41K256M16RE-125. Фактическая модель на основной плате — MT41K256M16TW-107. Поскольку предоставленные варианты не включают модель MT41K256M16TW-107, выбрана эта совместимая модель. Основная плата использует две микросхемы MT41K256M16TW-107, каждая с шириной шины данных 16 бит, поэтому две микросхемы составляют 32 бита. Оставьте другие параметры конфигурации по умолчанию.
Настройте тактовую частоту PS. Нажмите на страницу Clock Configuration слева. Этот интерфейс в основном используется для настройки тактовой частоты в ZYNQ PS. PS на основной плате использует активный кварцевый генератор 33.3333 МГц. Для тактовой частоты CPU, тактовой частоты DDR и других периферийных тактовых частот оставьте настройки по умолчанию.
В этом руководстве строится минимальная встроенная система для ZYNQ7020, использующая только сторону PS ZYNQ. Поэтому мы удаляем интерфейсы для взаимодействия между концами PS и PL. На странице Clock Configuration разверните PL Fabric Clocks и снимите флажки с FCLK_CLK0/1/2/3.
Нажмите на страницу PS-PL Configuration слева, разверните General справа и снимите флажки с соответствующих элементов в соответствии с рисунком ниже.
Конфигурация ZYNQ7 Processing System завершена, нажмите "OK". В Diagram вы можете видеть, что IP-модуль ZYNQ7 Processing System имеет только интерфейсы DDR и FIXED_IO, как показано. По сравнению с тем, когда IP был только что добавлен, модуль ZYNQ7 PS имеет на четыре интерфейса меньше, что соответствует нескольким интерфейсам, с которых ранее были сняты флажки.
Нажмите на позицию, указанную стрелкой на рисунке выше―Run Block Automation‖, и появится следующее диалоговое окно:
В этом интерфейсе мы можем выбрать автоматическое подключение интерфейсов IP-модуля. В этом проекте только один IP-модуль. Подтвердите, установив флажок processing_system7_0 слева, затем нажмите "OK". На этом этапе модуль ZYNQ7 PS имеет две группы внешних интерфейсов, а именно DDR и FIXED_IO. Эти интерфейсы будут назначены на конкретные выводы устройства ZYNQ. Нажав "+" на интерфейсе модуля ZYNQ7 PS, чтобы развернуть эти две группы интерфейсов, вы можете наблюдать, какие сигналы содержит каждая из них.
После сохранения текущего блочного проекта вы можете проверить, есть ли в текущем проекте какие-либо ошибки. Нажмите кнопку, указанную стрелкой на рисунке ниже. После завершения проверки появится диалоговое окно с сообщением об отсутствии ошибок или критических предупреждений, нажмите "OK", как показано ниже:
В окне Sources выберите sysetm.bd в разделе Design Sources, соответствующий предыдущему файлу Block Design. Щелкните правой кнопкой мыши на sysetm.bd, сначала нажмите Reset Output Products, а затем нажмите "Generate Output Products":
Появляется диалоговое окно "Generate Output Products". Вы можете оставить настройки Synthesis Options по умолчанию; Run Setings можно оставить по умолчанию или установить на максимальное количество потоков, доступных для процессора вашего персонального компьютера. Затем нажмите "Generate", чтобы сгенерировать файлы синтеза, реализации и симуляции для проекта. В процессе "Generate" будут сгенерированы все необходимые выходные результаты для проекта. После завершения Generate нажмите "OK" во всплывшем диалоговом окне.
Снова щелкните правой кнопкой мыши на system.bd, затем выберите "Create HDL Wrapper". Во всплывшем диалоговом окне подтвердите, установив флажок "Let Vivado manage wrapper and auto-update", затем нажмите "OK". После завершения создания структура Design Sources выглядит следующим образом:
Если в проекте используются ресурсы PL, необходимо добавить ограничения на выводы, а проект необходимо синтезировать, реализовать и сгенерировать файл Bitstream. Поскольку этот проект является минимальной системой и не использует часть PL, эти шаги не обязательны, и аппаратное обеспечение можно напрямую экспортировать в xsa.
Выберите в меню File > Export > Export hardware.
Во всплывшем интерфейсе нажмите next напрямую:
Поскольку мы не сгенерировали файл bitstream, напрямую выберите первый вариант в следующем интерфейсе. Если файл bitstream был сгенерирован, нажмите второй вариант "Include bitstream", нажмите next:
Далее будет сгенерирован файл .xsa. Этот файл упаковывает все аппаратные компоненты и информацию об аппаратной платформе. Файл .xsa будет использоваться позже с программным обеспечением Vitis или Linux.
Наконец, нажмите finish для завершения:
После завершения экспорта аппаратного обеспечения выберите в меню Tools > Launch vitis IDE. Появится всплывающее окно для выбора пространства имен. Вы можете создать новую папку vitis в файле всего проекта.
В vitis можно создавать два типа проектов: platform project и application project.
platform project (Platform Project)
На основе файла описания аппаратного обеспечения (.xsa), экспортированного из Vivado, создает платформу, содержащую следующее: конфигурацию процессора (такие как параметры Zynq PS, тактовые частоты, периферийные устройства), интерфейс потока битов программируемой логики (PL), отображение памяти (адресное пространство DDR, регистры периферийных устройств).
Генерирует поддержку на системном уровне: предоставляет BSP (Board Support Package), библиотеки драйверов и уровень аппаратной абстракции для вызовов приложений.
Один проект платформы может соответствовать нескольким проектам приложений.
Генерирует файл .xpfm (Xilinx Platform), который служит зависимостью для проектов приложений.
Application project (Application Project)
Соответствует фактически работающему приложению: написание программного кода, работающего на процессоре (таком как ARM Cortex-A9) на существующей аппаратной платформе (.xpfm или напрямую .xsa).
Основан на аппаратной платформе проекта платформы, не требует изменения базовой конфигурации. Поддерживает разработку приложений для bare metal (Baremetal), FreeRTOS или Linux.
Генерирует исполняемый файл (.elf), который можно загрузить в DDR или запрограммировать во Flash.
| Пункт сравнения | Platform Project | Application Project |
|---|---|---|
| Цель | Определение аппаратной инфраструктуры | Разработка ПО, работающего на аппаратном обеспечении |
| Входная зависимость | Экспортированный из Vivado файл .xsa | Существующая платформа (.xpfm или напрямую .xsa) |
| Частота изменений | Низкая (редко меняется после стабилизации аппаратного обеспечения) | Высокая (итеративная разработка кода) |
| Выходной файл | .xpfm (файл описания платформы) | .elf (исполняемый файл) |
| Типичный пользователь | Инженер по аппаратному обеспечению/Системный архитектор | Инженер-программист/Встраиваемый разработчик |
При создании проекта vitis вы можете сначала создать проект платформы, а затем создать проект приложения на основе этого проекта платформы. Вы также можете напрямую создать проект приложения, но это автоматически создаст связанный с этим проектом приложения проект платформы.
Здесь, в качестве примера, рассмотрим процесс создания сначала проекта платформы, а затем проекта приложения.
Впоследствии наши проекты приложений будут основаны на созданном проекте платформы.
Нажмите "Browse", выберите файл xsa, сгенерированный vivado.
После выбора в опциях ниже автоматически появится используемая операционная система. Также установите флажок "Generate boot components", который автоматически добавит файлы, связанные с fsbl, в аппаратную платформу. Нажмите "Finish":
На этом этапе создание проекта платформы завершено. Последующие создаваемые нами проекты приложений будут основаны на этом проекте платформы. Как показано:
Если позже файл ресурсов аппаратного обеспечения (.xsa) будет изменен (путем повторной компиляции в vivado для генерации нового файла xsa), просто обновите файл ресурсов аппаратного обеспечения. Конкретная операция: щелкните правой кнопкой мыши на проекте платформы, выберите "update Hardware specification" из всплывших вариантов. Во всплывшем окне выберите вновь сгенерированный файл xsa. Затем щелкните правой кнопкой мыши на этом проекте платформы и выберите Build project, чтобы перестроить проект платформы.
Далее нам нужно создать проект приложения на основе этого проекта платформы.
Создайте через File->New->Application Project:
Во всплывшем интерфейсе нажмите next:
Выберите ранее созданный проект платформы:
Обратите внимание здесь. Если проект платформы ранее не был создан, вы можете выбрать вкладку Create a new platform from hardware. Это создаст проект приложения, а также создаст проект платформы.
Заполните имя проекта, нажмите next:
На следующей странице вы можете выбрать желаемую операционную систему. На этот раз мы используем bare metal, нажмите next:
Выберите "Hello World" в "Templates": Поскольку создается простой проект "Hello World", в шаблоне уже есть сгенерированный код, который можно использовать без изменений. Нажмите "Finish":
На этом этапе создан новый проект приложения, как показано:
Нажмите "hello_world_system"->"hello_world"->src, внутри находится программный файл .c:
Щелкните правой кнопкой мыши на "hello_world", нажмите "build project" для компиляции кода. Если ошибок нет, будет сгенерирован elf-файл. Если есть ошибки, в разделе Problems будут видны сообщения об ошибках.
Настройте DIP-переключатель режима загрузки платы разработки в режим JTAG. Используйте кабель USB типа-C для подключения порта JTAG на плате разработки к компьютеру. Питание платы разработки уже включено. Приготовьте другой кабель USB типа-C для подключения порта PS_UART на плате разработки к компьютеру. Одновременно откройте инструмент последовательного порта (например, MobaXterm) на компьютере, выберите соответствующий распознанный USB-последовательный порт и установите его скорость передачи 115200.
Нажмите "Xilinx"->"XSCT Console", в правом нижнем углу появится консоль XSCT. Введите команду "connect". Эта команда устанавливает соединение для отладки с целевым аппаратным обеспечением (например, нашей платой разработки Zynq-7020). Затем введите команду "targets". Эта команда перечисляет все доступные цели отладки (процессоры/аппаратные компоненты) в текущей системе. Если появится ответ, показанный на рисунке, это означает, что соединение успешно установлено.
Вы можете щелкнуть правой кнопкой мыши и выбрать Debug as:
Или действуйте через ярлык Debug: Нажмите на выпадающий список, чтобы вызвать выпадающие options, и выберите проект приложения, который требует отладки:
На этом этапе он перейдет в режим отладки. По умолчанию он переходит непосредственно к main(). После этого вы можете выполнять пошаговую отладку, отладку с точками останова:
Если необходимо перезагрузить программу, вы можете щелкнуть правой кнопкой мыши на Debug->[System Project Debug], выбрать terminate and relaunch:
После Run информация "Hello World" и другие символьные信息 будут выведены в инструменте последовательного порта компьютера.
Есть два способа генерации BOOT.bin:
Щелкните правой кнопкой мыши на "hello_world_system" и выполните build project. Это автоматически сначала скомпилирует "hello_world" для генерации elf-файла, затем объединит сгенерированный elf-файл с файлом fsbl.elf и файлом bitstream из проекта платформы, чтобы сгенерировать файл BOOT.bin. В конечном итоге именно этот файл BOOT.bin программируется во flash.
Щелкните правой кнопкой мыши на "hello_world_system", нажмите "Create Boot Image". Или действуйте через меню Xilinx->Create Boot Image.
Выберите "Create new BIF file", обязательно убедитесь, что тип "Output format" — BIN, как показано ниже:
Добавьте следующее содержимое по порядку:
fsbl.elf → type: bootloader
system.bit (если этот файл существует) → type: data, выберите файл .bit, сгенерированный в vivado
hello_world.elf → type: data.
Наконец, нажмите "Create Image", чтобы завершить создание.
Если появится результат, показанный на рисунке, это указывает на успешное создание.
При последующей ручной генерации файла BOOT.bin вы можете нажать "Import form existing BIF file", выбрать правильный путь к файлу и нажать "Create Image ":
Нажмите "Xilinx"->"Program Flash":
В появившемся интерфейсе обязательно убедитесь, что "Image File" — это сгенерированный файл BOOT.BIN, "Offset" начинается с 0x00000000, а "Init File" — это файл "fsbl.elf".
Объясните роли файлов BOOT.Bin и fsbl.elf:
BOOT.BIN:
Пакет образа загрузки: Объединяет несколько файлов в полный образ загрузки для непосредственного чтения BootROM.
Содержимое (по порядку):
FSBL (fsbl.elf): Инициализирует аппаратное обеспечение.
Файл потока битов (system.bit, опционально): Конфигурирует логику PL.
Приложение (hello_world.elf): Пользовательский код.
Другие компоненты (такие как U-Boot, PMUFW и т.д., опционально).
fsbl.elf:
Инициализация аппаратного обеспечения:
Конфигурирует тактовые частоты PS (Processor System) Zynq, контроллер DDR, периферийные устройства (такие как QSPI Flash, UART и т.д.).
Загружает файл потока битов (.bit) PL (Programmable Logic), конфигурирует логику FPGA.
Загрузка программы второго этапа:
Считывает приложение (например, hello_world.elf) из Flash в память DDR и переходит по его адресу входа для выполнения.
Нажмите "Program" и подождите несколько секунд. Если появится "Flash Operation Successful", это указывает на успешное программирование QSPI Flash.
Выключите плату разработки, установите DIP-переключатель, соответствующий режиму загрузки, в положение QSPI. Подключите последовательный порт PS_UART к компьютеру кабелем Type-C и включите питание. Откройте соответствующий последовательный порт на компьютере с помощью инструмента для последовательного порта. Затем нажмите кнопку сброса на плате разработки, и вы увидите соответствующую информацию на экране инструмента для последовательного порта компьютера.